<?php
// +----------------------------------------------------------------------+
// | PHP Version 4                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license,      |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors:  Wolfram Kriesing, Paolo Panto, vision:produktion <wk@visionp.de>
// |           Lorenzo Alberton <l.alberton@quipo.it>                     |
// +----------------------------------------------------------------------+
//
// $Id: example.php,v 1.3 2003/05/10 00:10:00 quipo Exp $
//

require_once 'MDB/QueryTool.php';


// change this!!!!! and the DSN to your DB
$DB_BACKEND = 'pgsql';
$DB_BACKEND = 'mysql';



define ('TABLE_TIME',   'time');
// the mysql setup!
if ($DB_BACKEND == 'mysql') {
    $dbDSN = 'mysql://root@localhost/test';
    define ('TABLE_USER',   'user');
}

// postgreSQL setup, use PEAR::DB >1.4b1
if ($DB_BACKEND == 'pgsql') {
    $dbDSN = "pgsql://test:test@/test";
    define ('TABLE_USER',   'uuser');     // user is a reserved word in postgres
}

                        
class user extends MDB_QueryTool
{
    var $table =        TABLE_USER;
    var $sequenceName = TABLE_USER;

    // this is default, but to demonstrate it here ...
    var $primaryCol =   'id';

    /**
    *   this table spec assigns a short name to a table name
    *   this short name is needed in case the table name changes
    *   i.e. when u put the appl on a providers db, where you have to prefix
    *   each table, and you dont need to change the entire appl to where you refer
    *   to joined table columns, for that joined results the short name is used
    *   instead of the table name
    */
    var $tableSpec = array(
                            array('name'    =>  TABLE_USER, 'shortName' =>  'user')
                            ,array('name'   =>  TABLE_TIME, 'shortName' =>  'time')
                        );


}



// this set an error-callback method, which will be called in case something really went wrong
// you can use 'setErrorLogCallback' to define the callback method for log-messages - non critical.
// and you can use 'setErrorSetCallback' to define a callback for errors which prevent the query
// from properly executing
$user = new user($dbDSN, array('errorCallback'=>'myPrint'));
//$user->setErrorCallback('myPrint'); this could be used too


//
//      1
//
// get a single entry with a given 'id'
headline('$user->get(3)');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$res = $user->get(3);
myPrint($res);
// query: SELECT * FROM user WHERE id=3


//
//      2
//
// get all entries from the table
headline('$user->getAll()');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$res = $user->getAll();
myPrint($res);
// query: SELECT * FROM user


//
//      3
//
// get the first 10 entries from the table (LIMIT 0,10)
headline('$user->getAll(0,10)');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$res = $user->getAll(0,10);
myPrint($res);
// query: SELECT * FROM user LIMIT 0,10


//
//      4
//
// get all data where the id>3
headline('using setWhere');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$user->setWhere('id>3');
$res = $user->getAll();
myPrint($res);
// query: SELECT * FROM user WHERE id>3


//
//      5
//
// setting multiple query-parts
headline('using set[Where,Order,Group]');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
// for proper SQL92 i think we need to select only the col we use in group
// in mysql you can also leave out the following line
$user->setSelect('name');
$user->setWhere('name IS NOT NULL');
$user->setOrder('name');
$user->setGroup('name');
$res = $user->getAll();
myPrint($res);
// query: SELECT * FROM user WHERE name IS NOT NULL GROUP BY name ORDER BY name


//
//      6
//
// setting multiple query-parts
headline('using setIndex');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$user->setIndex('name');
$res = $user->getAll();
myPrint($res);
// query: SELECT * FROM user
// the result-array is indexed by 'name'



//
//      7
//
// setting multiple query-parts
headline('using setIndex using 2 columns!');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$user->setIndex('name,surname');
$res = $user->getAll();
myPrint($res);
// query: SELECT * FROM user
// the result-array is indexed by 'name,surname'



//
//      8
//
// join the table 'time' this automatically detects where there are
// columns that refer to one another, this uses a regExp that you can simply
// modify (see $_tableNamePreg and $_columnNamePreg), by default this maps
// stuff like 'user_id'=>'user.id'
headline('using autoJoin');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$user->autoJoin('time');
$user->setOrder('surname');
$res = $user->getAll();
myPrint($res);
// query: SELECT * FROM user,time WHERE user.id=time.user_id ORDER BY surname


//
//      9
//
// does the same as the example above
// only that you have to hardcode the join by hand, no autoJoin here
headline('using setJoin instead of autoJoin');
$user->reset();     // reset the query-builder, so no where, order, etc. are set
$user->setJoin('time',TABLE_USER.'.id=time.user_id');
$user->setOrder('surname');
$res = $user->getAll();
myPrint($res);
// query: SELECT * FROM user,time WHERE user.id=time.user_id ORDER BY surname


//
//      10
//
headline('adding data using $user->save($data)');
$data = array('login'=>'new','name'=>'foo','surname'=>'bar');
$fooBarId = $user->save($data);
myPrint($fooBarId);
// query: INSERT INTO user (id,login,name,surname) VALUES (<sequences>,"new","foo","bar")


//
//      11
//
headline('updating using $user->save($data)');
$data = array('id'=>$fooBarId,'login'=>'NEW','name'=>'Mr. foo');
$res = $user->save($data);
myPrint($res);
// query: UPDATE user (id,login,name,surname) VALUES (<sequences>,"new","foo","bar")


//
//      12
//
headline('updating using $user->update($data)');
$res = $user->update($data);
myPrint($res);
// query: UPDATE user (id,login,name,surname) VALUES (<sequences>,"new","foo","bar")


//
//      13
//
headline("remove the entry \$user->remove($fooBarId)");
$res = $user->remove($fooBarId);
myPrint($res);
// query: DELETE FROM "uuser" WHERE "id" = $fooBarId





//
//  helper functions
//
function headline( $string='' )
{
    global $headlineCnt;

    if( $string )
    {
        $headlineCnt++;
        print "<h1>$headlineCnt - $string</h1>";
    }
}
function myPrint($data)
{
    print "<pre>";
    print_r($data);
    print '</pre>';
}

?>